package com.xiaohong.user.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * Swagger配置
 */
@Configuration
public class SwaggerConfig {
/*
    @Bean
    public Docket UserDocket() {

        return new Docket(DocumentationType.OAS_30)
                // 是否启用Swagger ,true 开启， false 关闭
                .enable(true)
                // 用来创建该API的基本信息，展示在文档的页面中（自定义展示的信息）
                .apiInfo(apiInfo())
                // 组名
                .groupName("user")
                // 设置哪些接口暴露给Swagger展示
                .select()
                // RequestHandlerselectors，配置要扫描接口的方式
                // basePackage:指定要扫描的包
                // any:扫描全部
                // none:不扫描
                // withclassAnnotation:扫描类上的注解，参数是一个注解的反射对象
                // withMethodAnnotation:扫描方法上的注解
                .apis(RequestHandlerSelectors.basePackage("com.xiaohong.user.controller"))  // 配置要扫描的接口
                .paths(PathSelectors.ant("/user/**")) // 配置要扫描的路径
                .build()
                //设置安全模式，swagger可以设置访问token
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }

    @Bean
    public Docket UserAddressDocket() {

        return new Docket(DocumentationType.OAS_30)
                .enable(true)
                .apiInfo(apiInfo())
                .groupName("userAddress")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xiaohong.user.controller"))  // 配置要扫描的接口
                .paths(PathSelectors.ant("/userAddress/**")) // 配置要扫描的路径
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }
*/
/*


    */
/**
     * 个人信息
     * @return
     *//*

    private ApiInfo apiInfo() {
        // springfox.documentation.service.Contact
        Contact contact = new Contact("小鸿", "www.xiaohong.work", "1990063814@qq.com");
        return new ApiInfoBuilder()
                .title("用户微服务")
                .description("用户微服务接口信息")
                .contact(contact)   // 联系方式
                .version("1.0")  // 版本
                .build();
    }

    */
/**
     * 安全模式，这里指定token通过Authorization头请求头传递
     * @return
     *//*

    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeyList;
    }

    */
/**
     * 安全上下文
     *//*

    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        //通过PathSelectors.regex("^(?!auth).*$")，所有包含"auth"的接口不需要使用securitySchemes。即不需要使用上文中设置的名为“Authorization”，type为“header”的参数。
//                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build());
        return securityContexts;
    }
    */
/**
     * 默认的安全上引用
     *//*

    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }
*/


// swagger3+OpenAPI3



    @Bean
    public GroupedOpenApi userApi() {
        return GroupedOpenApi.builder()
                .group("user")
                .pathsToMatch("/user/**")
                .build();
    }
    @Bean
    public GroupedOpenApi userAddressApi() {
        return GroupedOpenApi.builder()
                .group("userAddress")
                .pathsToMatch("/userAddress/**")
                .build();
    }


    @Bean
    public OpenAPI springShopOpenAPI() {
        SecurityRequirement securityRequirement = new SecurityRequirement().addList("Authorization"); // 名字和创建的SecuritySchemes一致
        List<SecurityRequirement> list = new ArrayList<>();
        list.add(securityRequirement);
        return new OpenAPI()
                .components(new Components().addSecuritySchemes("Authorization", // key值
                        new io.swagger.v3.oas.models.security.SecurityScheme()
                                .type(io.swagger.v3.oas.models.security.SecurityScheme.Type.APIKEY) //请求认证类型
                                .name("Authorization") //API key参数名
                                .description("token令牌") //API key描述
                                .in(SecurityScheme.In.HEADER))) //设置API key的存放位置
                .security(list)
                .info(new Info().title("用户微服务")
                        .description("用户微服务接口文档")
                        .version("v0.0.1")
                        .license(new License().name("小鸿").url("http://www.xiaohong.work")));
    }




}
